// 通过动态规划来解决，已知若是 1 个骰子，则 6 面出现的概率都是一样的，即 1 / 6
// 若是两个骰子，则可以在原先 1 个骰子的基础上进行概率计算，已知两个骰子的排列为

// var twoSum = function (n) {
//   let dp = [1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6];
//   for (let i = 2; i <= n; i++) {
//     let temp = [];
//     for (let j = 1; j <= 6; j++) {
//       for (let k = 0; k < dp.length; k++) {
//         let sum = k + j - 1;
//         temp[sum] = (temp[sum] || 0) + (dp[k] * 1) / 6;
//       }
//     }
//     dp = temp;
//   }
//   return dp;
// };

// 举个例子，三个骰子，总点数是 5，也就是 dp[5] 出现的概率
// dp[5] = dp[4](最后一个骰子是 1，前面的骰子是 4 出现的概率) +
//  dp[3](最后一个骰子是 2，前面的骰子是 3 出现的概率) +
//  dp[2](最后一个骰子是 3，前面的骰子是 2 出现的概率) +
//  dp[1](最后一个骰子是 4，前面的骰子是 1 出现的概率) +
//  dp[0](最后一个骰子是 5，前面的骰子是 0 出现的概率) +
//  dp[-1](最后一个骰子是 6，前面的骰子是 -1 出现的概率)
var twoSum = function (n) {
  // 判断总共有多少个
  let num = n * 6;
  let dp = [];
  for (let i = 0; i <= n; i++) {
    dp.push(new Array(num + 1).fill(0));
  }

  // 赋初值
  for (let i = 1; i <= 6; i++) {
    // 如果只有一个骰子，这些点数出现的次数都只有一次
    dp[1][i] = 1;
  }

  for (let i = 2; i <= n; i++) {
    // 这里的 i 是骰子的个数
    for (let j = i; j <= 6 * j; j++) {
      // 这里的 j 是 i 个骰子会出现的次数，倒序
      // 两个骰子可能出现的点数 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2
      for (let k = 1; k <= 6; k++) {
        // 这里的 k 是最后一个骰子能出现的点数，肯定是 1~6
        if (j - k >= i - 1) {
          // 总点数 - 最后一个骰子的点数 肯定要大于等于剩余骰子的个数
          dp[j] += dp[j - k];
        }
      }
    }
  }

  let all = Math.pow(6, n);
  let res = [];
  for (let i = n; i <= num; i++) {
    res.push((dp[i] * 1.0) / all);
  }
  return res;
};
